package com.example.blog_system.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description: 密码工具集 用来对注册的密码进行加盐加密 对登录密码进行加盐加密验证 和对应用户密码是否一致
 */
@Slf4j
public class PasswordUtils {

    /**
     * 对注册的密码进行加盐加密
     * <p>
     * 通过 (盐值+初始密码)合并后 再用md5进行加密 得到加盐加密的密码 再将盐值+间隔符+加盐加密的密码 形成最后存在数据库的密码
     * 约定: 盐值32位 间隔符& 加盐加密的密码32位  最终密码65位
     *
     * @param password 初始注册密码
     * @return 加盐加密后的密码
     */
    public static String encrypt(String password) {

        // 通过UUID得到随机盐值  共36位 有4位是 - 进行去除 得到32位盐值
        String salt = UUID.randomUUID().toString().replace("-", "");
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));

        String finalPassword = salt + "&" + saltPassword;

        return finalPassword;
    }


    /**
     * 方法1的重载 用于给登录密码进行加盐加密得到最终密码
     *
     * @param salt     生成的盐值
     * @param password 要加密的密码
     * @return
     */
    public static String encrypt(String salt, String password) {
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        String finalPassword = salt + "&" + saltPassword;
        return finalPassword;
    }

    /**
     * 验证 登录密码 是否和加密密码相同
     * 将登录密码同样步骤进行加盐加密   盐值从加密密码里截取
     * 判断是否和对应密码一致
     *
     * @param password      登录密码
     * @param finalPassword 真实加盐加密 密码
     * @return
     */
    public static boolean check(String password, String finalPassword) {

        String salt = finalPassword.substring(0, 32); // 截取 加密的密码中的盐值
        String confirmPassword = encrypt(salt, password); // 对登录密码进行加盐 加密
        // 判断登录密码的有效性
        if (!StringUtils.hasLength(confirmPassword) || confirmPassword.length() != 65) {
            return false;
        }

        log.info("password:"+password);
        return confirmPassword.equals(finalPassword);

    }

    // 验证 加盐加密算法
    public static void main(String[] args) {
        System.out.println(encrypt("123"));
        System.out.println(encrypt("123"));
        System.out.println(encrypt("123"));

        System.out.println(check("12", encrypt("123")));
        System.out.println(check("123", encrypt("123")));
        System.out.println(encrypt("1"));
    }
}
